.text
.section .rodata
.LC0:
    .string "p = %d\n"
.LC1:
    .string "ppp = %d\n"
.LC2:
    .string "*p = %hd\n"
.LC3:
    .string "***ppp = %hd\n"
.text
.globl main
.type main, @function
main:
    pushq %rbp
    movq %rsp, %rbp

    // 分配2个变量就可以了16字节
    subq $16, %rsp

    // p: -8(%rbp)
    // ppp: -16(%rbp)
    movq $10, -8(%rbp) /* p */
    // 这里为什么是加2呢？因为需要加的是sizeof（指针指向的类型）
    addq $2, -8(%rbp) /* p */
    movq -8(%rbp) /* p */, %rsi
    leaq .LC0(%rip), %rdi
    movl $0, %eax
    call printf

    // 打开这里会报段错误
    /**
    movq -8(%rbp), %rax
    movl (%rax), %esi
    leaq .LC2(%rip), %rdi
    movl $0, %eax
    call printf
    /**/

    movq $10, -16(%rbp) /* ppp */
    // 这里指针指向的类型是一个指针，所以加8
    addq $8, -16(%rbp) /* ppp */
    movq -16(%rbp) /* ppp */, %rsi
    leaq .LC1(%rip), %rdi
    movl $0, %eax
    call printf

    // 打开这里会报段错误
    /**
    movq -16(%rbp), %rax
    movq (%rax), %rax
    movq (%rax), %rax
    // 这里需要零扩展
    movzwl (%rax), %esi 
    leaq .LC2(%rip), %rdi
    movl $0, %eax
    call printf
    /**/

    movl $0, %eax
    leave
    ret